package api

import (
	"bbs-go/internal/consts"
	"bbs-go/internal/models"
	"bbs-go/internal/pkg/errs"
	"bbs-go/internal/pkg/room"
	"encoding/json"
	"fmt"

	"github.com/kataras/iris/v12"
	"github.com/mlogclub/simple/web"
	"github.com/mlogclub/simple/web/params"

	"bbs-go/internal/services"
)

type ChatFriendsController struct {
	Ctx iris.Context
}

// 申请好友
func (c *ChatFriendsController) PostAddRequest() *web.JsonResult {
	user := services.UserTokenService.GetCurrent(c.Ctx)
	if user == nil {
		return web.JsonError(errs.NotLogin)
	}
	receiverUserId := c.Ctx.PostValueInt64Default("userId", 0)
	if receiverUserId <= 0 {
		return web.JsonError(web.NewError(-1, "请选择用户"))
	}
	message := c.Ctx.PostValueDefault("message", "")
	// 判断是否在添加自己
	if condition := receiverUserId == user.Id; condition {
		return web.JsonError(web.NewError(-1, "不能添加自己"))
	}

	// 判断是否已经是好友
	friend, err := services.ChatFriendsService.GetChatFriendsByFriendId(user.Id, receiverUserId)
	if err != nil {
		return web.JsonError(err)
	}

	if friend.Id > 0 { // 已经是好友
		return web.JsonError(web.NewError(-1, "已经是好友"))
	}

	// 判断是否已经申请过，状态为已申请
	friendRequest, err := services.ChatFriendsRequestService.GetChatFriendsRequestByFriendId(user.Id, receiverUserId)
	if err != nil {
		return web.JsonError(err)
	}

	if friendRequest.Id > 0 { // 已经申请过
		return web.JsonError(web.NewError(-1, "已申请，请等待对方处理。"))
	}

	// 创建添加申请
	services.ChatFriendsRequestService.Create(&models.ChatFriendsRequest{
		SenderUserId:   user.Id,
		ReceiverUserId: receiverUserId,
		Status:         consts.ChatFriendRequestStatus_1,
		Message:        message,
	})

	// 发送系统通知
	// 1.好友申请通知
	client := room.GlobalRoom.Clients[int(receiverUserId)]
	if client != nil && client.UserId > 0 {
		count, _ := services.ChatFriendsRequestService.GetUntreatedRequestCount(receiverUserId)
		// 查询群消息未读List
		friendRequestMessage := models.FriendRequestMessage{
			ReceiverId:   int(receiverUserId),
			RequestCount: count,
		}
		wsMessage := models.WsMessage{
			MessageType: 4,
			MessageData: friendRequestMessage,
		}
		bytes, _ := json.Marshal(wsMessage)

		client.Send <- bytes
	}

	return web.JsonData(models.Result{
		Result: true,
	})
}

// 查询申请列表
func (c *ChatFriendsController) GetRequestList() *web.JsonResult {
	user := services.UserTokenService.GetCurrent(c.Ctx)
	if user == nil {
		return web.JsonError(errs.NotLogin)
	}
	p := params.NewQueryParams(c.Ctx)
	p = p.PageByReq()
	res, err := services.ChatFriendsRequestService.GetRequestList(p.Paging, user.Id)
	if err != nil {
		return web.JsonError(err)
	}
	return web.JsonData(&web.PageResult{Results: res.List, Page: res.Paging})
}

// 查询我的申请列表
func (c *ChatFriendsController) GetMyRequestList() *web.JsonResult {
	user := services.UserTokenService.GetCurrent(c.Ctx)
	if user == nil {
		return web.JsonError(errs.NotLogin)
	}
	p := params.NewQueryParams(c.Ctx)
	p = p.PageByReq()
	res, err := services.ChatFriendsRequestService.GetMyRequestList(p.Paging, user.Id)
	if err != nil {
		return web.JsonError(err)
	}
	return web.JsonData(&web.PageResult{Results: res.List, Page: res.Paging})
}

// 处理申请好友
func (c *ChatFriendsController) PostRequestHandle() *web.JsonResult {
	user := services.UserTokenService.GetCurrent(c.Ctx)
	if user == nil {
		return web.JsonError(errs.NotLogin)
	}
	// 请求Id
	requestId := c.Ctx.PostValueInt64Default("requestId", 0)
	if requestId <= 0 {
		return web.JsonError(web.NewError(-1, "请选择申请好友"))
	}
	// 结果，1:拒绝，2:同意
	result := c.Ctx.PostValueIntDefault("result", 0)
	if result != 1 && result != 2 {
		return web.JsonError(web.NewError(-1, "申请结果非法"))
	}

	// 查询申请信息
	friendRequest := services.ChatFriendsRequestService.Get(requestId)
	if friendRequest == nil || friendRequest.Id == 0 {
		return web.JsonError(web.NewError(-1, "申请不存在"))
	}

	if friendRequest.ReceiverUserId != user.Id {
		return web.JsonError(web.NewError(-1, "无权限处理该申请"))
	}

	if friendRequest.Status != consts.ChatFriendRequestStatus_1 {
		return web.JsonError(web.NewError(-1, "该申请已处理"))
	}

	switch result {
	case 1: // 拒绝
		err := services.ChatFriendsRequestService.RefuseFriendRequest(friendRequest)
		if err != nil {
			return web.JsonError(err)
		}
	case 2: // 同意
		err := services.ChatFriendsRequestService.AgreeFriendRequest(friendRequest)
		if err != nil {
			return web.JsonError(err)
		}
	}
	return web.JsonData(models.Result{
		Result: true,
	})
}

// 查询好友列表
func (c *ChatFriendsController) GetList() *web.JsonResult {
	user := services.UserTokenService.GetCurrent(c.Ctx)
	if user == nil {
		return web.JsonError(errs.NotLogin)
	}
	p := params.NewQueryParams(c.Ctx)
	p = p.PageByReq()
	res, err := services.ChatFriendsService.GetChatFriendsList(p.Paging, user.Id)
	if err != nil {
		return web.JsonError(err)
	}
	return web.JsonData(&web.PageResult{Results: res.List, Page: res.Paging})
}

// 删除好友
func (c *ChatFriendsController) Delete() *web.JsonResult {
	user := services.UserTokenService.GetCurrent(c.Ctx)
	if user == nil {
		return web.JsonError(errs.NotLogin)
	}
	// 好友Id
	friendId := c.Ctx.PostValueInt64Default("friendId", 0)
	if friendId <= 0 {
		return web.JsonError(web.NewError(-1, "请选择好友"))
	}

	// 不能删自己
	if friendId == user.Id {
		return web.JsonError(web.NewError(-1, "不能删除自己"))
	}

	// 验证好友关系是否存在
	firend, err := services.ChatFriendsService.GetChatFriendsByFriendId(user.Id, friendId)
	if err != nil {
		return web.JsonError(err)
	}

	if firend.Id == 0 {
		return web.JsonError(web.NewError(-1, "好友关系不存在"))
	}

	err = services.ChatFriendsService.DeleteFriend(user.Id, friendId)
	if err != nil {
		return web.JsonError(err)
	}
	return web.JsonData(models.Result{
		Result: true,
	})
}

// 查询好友聊天记录
func (c *ChatFriendsController) GetRecord() *web.JsonResult {
	user := services.UserTokenService.GetCurrent(c.Ctx)
	if user == nil {
		return web.JsonError(errs.NotLogin)
	}
	friendId := c.Ctx.URLParamInt64Default("friendId", 0)
	p := params.NewQueryParams(c.Ctx)
	p = p.PageByReq()
	res, err := services.ChatFriendsMessagesService.GetFriendsMessageList(p.Paging, user.Id, friendId)
	if err != nil {
		return web.JsonError(err)
	}
	return web.JsonData(&web.PageResult{Results: res.List, Page: res.Paging})
}

// 查询好友聊天记录最近三天50条聊天记录
func (c *ChatFriendsController) GetRecordLast() *web.JsonResult {
	user := services.UserTokenService.GetCurrent(c.Ctx)
	if user == nil {
		return web.JsonError(errs.NotLogin)
	}
	friendId := c.Ctx.URLParamInt64Default("friendId", 0)
	if friendId == 0 {
		return web.JsonError(fmt.Errorf("好友不存在"))
	}
	res, err := services.ChatFriendsMessagesService.GetRecentFriendsMessageList(user.Id, friendId)
	if err != nil {
		return web.JsonError(err)
	}
	services.ChatFriendsMessagesService.ChatFriendsMessageRead(user.Id, friendId)
	return web.JsonData(&web.PageResult{Results: res.List, Page: res.Paging})
}
